package com.loveto.service;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.loveto.common.ImageDownloader;
import com.loveto.common.JsonUtils;
import com.loveto.constant.LovetoConstant;
import com.loveto.constant.LovetoGiftAnims;
import com.loveto.model.CompetitorInfo;

public class SelectWinner1RoundActivity extends BaseActivity implements
View.OnClickListener{
	
	// 사용하는 변수들
	private Integer roundSeq; // 라운드
	private String tournamentID; // 토너먼트 아이디
	private Map<Integer, List<CompetitorInfo>> CompetitorInfoMap; // 경쟁자 정보
	private int currentGroupNum; // 현재 그룹
	private int groupSize; // 그룹사이즈 
	private List<RelativeLayout> footerBtnList; // 푸터 버튼들
	private List<RelativeLayout> oneMemberLayoutList; // 참여자 카드들
	private ImageView groupAlphabetImageView;
	private RelativeLayout v_content_main_outer;
	private Integer totalCompetitorSize; // 경쟁자들 토탈사이즈
	private RelativeLayout btn_next_round;
	private ProgressDialog progressDialog;
	private Handler myHandler;
	private LovetoGiftAnims giftAnims;
	private List<AnimationDrawable> giftAnimList;
	private ArrayList<Integer> giftidList;

	private Paint mPaint;
	private int posCircleTop;
	private int posCircleTopX;
	private int posCircleLeft;
	private int posCircleLeftY;
	private int posCircleRight;
	private int posCircleRightY;
	private int posCircleBottom;
	private int posCircleBottomX;
	private int presentWinner;
	private int presentCompetitorCnt;
	private boolean isWinnerSelectedGroup;
	private boolean isNowAnimation;
	private Animation animRing;
	private Animation animText;
	private Animation animRingSmall;
	private Animation animPhotoWinner;
	private Animation animPhotoLoser;
	private Animation animWhole;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.loveto_select_winner_1round);
		
		//전 엑티비티에서 토너먼트ID, 라운드시퀀스 받아오기
		getTournamentIDAndRoundSeq();
		
		// Round 글자 수정
		TextView textView = (TextView) findViewById(R.id.textView1);
		textView.setText(roundSeq+"ROUND");
		
		// 초기화
		progressDialog = new ProgressDialog(this);
		myHandler = new Handler();
		giftAnims = new LovetoGiftAnims();
		giftAnimList = new ArrayList<AnimationDrawable>();
		giftidList = new ArrayList<Integer>();
		currentGroupNum = 0; // 현재 그룹 넘버
		CompetitorInfoMap = new HashMap<Integer, List<CompetitorInfo>>(); // 데이터들
		groupAlphabetImageView = (ImageView) findViewById(R.id.img_group_alphabet);
		isWinnerSelectedGroup = false; //현재 보고있는 그룹에서 승자를 선택 했는지
		isNowAnimation = false; //애니메이션이 진행 중인지
		
		oneMemberLayoutList = new ArrayList<RelativeLayout>();
		oneMemberLayoutList.add((RelativeLayout) findViewById(R.id.first_row_first_layout));
		oneMemberLayoutList.add((RelativeLayout) findViewById(R.id.first_row_second_layout));
		oneMemberLayoutList.add((RelativeLayout) findViewById(R.id.second_row_first_layout));
		oneMemberLayoutList.add((RelativeLayout) findViewById(R.id.second_row_second_layout));
		
		// 버튼 초기화
		footerBtnList = new ArrayList<RelativeLayout>();
		footerBtnList.add((RelativeLayout) findViewById(R.id.footer_a));
		footerBtnList.add((RelativeLayout) findViewById(R.id.footer_b));
		footerBtnList.add((RelativeLayout) findViewById(R.id.footer_c));
		footerBtnList.add((RelativeLayout) findViewById(R.id.footer_d));
		footerBtnList.add((RelativeLayout) findViewById(R.id.footer_e));
		footerBtnList.add((RelativeLayout) findViewById(R.id.footer_f));
		footerBtnList.add((RelativeLayout) findViewById(R.id.footer_g));
		footerBtnList.add((RelativeLayout) findViewById(R.id.footer_h));
		btn_next_round = (RelativeLayout) findViewById(R.id.btn_next_round);
		
		// 롤백(2~3라운드에 팅겼을때 대비) 하고  데이터 받고 
		if (isNetworkAvailableAndNotice()) {
			rollbackRoundAndGetJsonByThread();
		} else {
			return ;
		}
		
		// 기용이형 애니메이션~
		//축하 관련 애니메이션
		animRing = AnimationUtils.loadAnimation(this, R.anim.select_winner01_celebrate_ring);
		animText = AnimationUtils.loadAnimation(this, R.anim.select_winner01_celebrate_text);
		animRingSmall = AnimationUtils.loadAnimation(this, R.anim.select_winner01_celebrate_ring_small);
		animPhotoWinner = AnimationUtils.loadAnimation(this, R.anim.select_winner01_celebrate_photo_winner);
		animPhotoLoser = AnimationUtils.loadAnimation(this, R.anim.select_winner01_celebrate_photo_loser);
		animWhole = AnimationUtils.loadAnimation(this, R.anim.select_winner01_celebrate_whole);
		
		//그림을 그리는 패인터
		mPaint = new Paint();
		mPaint.setAntiAlias(true);
		mPaint.setDither(true);
		mPaint.setColor(0xFF82D445);
		mPaint.setStyle(Paint.Style.STROKE);
		mPaint.setStrokeJoin(Paint.Join.ROUND);
		mPaint.setStrokeCap(Paint.Cap.ROUND);
		mPaint.setStrokeWidth(8);
		
		//그림을 그릴 수 있는 영역
		MyView vw = new MyView(this);
		v_content_main_outer = (RelativeLayout) findViewById(R.id.content_main_outer);
		v_content_main_outer.addView(vw);

		//우승 축하 애니메이션 종료 시 작은 동그라미로 승자 표시함.
		animWhole.setAnimationListener(new AnimationListener() {
			@Override
			public void onAnimationEnd(Animation animation) {
				//승자에게 작은 동그라미를 붙여줌.
				((ImageView)oneMemberLayoutList.get((presentWinner-1)).findViewById(R.id.winner_ring)).setVisibility(ImageView.GONE);
				((ImageView)oneMemberLayoutList.get((presentWinner-1)).findViewById(R.id.winner_text_celebrate)).setVisibility(ImageView.GONE);
				((ImageView)oneMemberLayoutList.get((presentWinner-1)).findViewById(R.id.winner_ring_small)).setVisibility(ImageView.VISIBLE);
				((ImageView)oneMemberLayoutList.get((presentWinner-1)).findViewById(R.id.winner_ring_small)).startAnimation(animRingSmall);
				isNowAnimation = false;
			}
			@Override
			public void onAnimationRepeat(Animation animation) {
			}
			@Override
			public void onAnimationStart(Animation animation) {
			}
		});
	}
	
	/**
	 * 
	 */
	private void rollbackRoundAndGetJsonByThread() {
		progressDialog.setMessage("정보를 불러오고있습니다.");
		progressDialog.show();
		
		Runnable runnable = new Runnable(){
			@Override
			public void run() {
				//UI 를 건들기 때문에 핸들러 사용.
				myHandler.post(new Runnable() {
					@Override
					public void run() {
						try {
							
							// 데이터 받기전에 데이터 롤백하고 시작(round1일때만)
							rollbackTotalRoundInfo();
							
							// 데이터 받고 푸터버튼 셋팅
							getCompetitorJSONAndSetFooter();
							//Log.d("tag", "데이터 받기 끝");
							
							// 데이터가 있다면
							if(CompetitorInfoMap.containsKey(currentGroupNum)){
								// 버튼 클릭리스너 달기
								btn_next_round.setOnClickListener(SelectWinner1RoundActivity.this);
								
								//페이지 셋팅
								setOneGroupLayout(CompetitorInfoMap.get(currentGroupNum)); // 한사람의 페이지  만들기
								setSelectingBtn(currentGroupNum); // 흰색 버튼으로
								setBtnNextRound(); //다음조가기 버튼 설정
								
							} else {
								viewToast("데이터가 없습니다.");
							}
							
						} catch(Exception e) {
							Log.d("tag", e.toString());
						} finally {
							progressDialog.dismiss();
						}
					}
				});
			}
		};
		new Thread(runnable).start();
	}

	private void getTournamentIDAndRoundSeq() {
		// TODO Auto-generated method stub
		Intent intent = getIntent();
		tournamentID = intent.getStringExtra("tournamentID");
		roundSeq = intent.getIntExtra("roundSeq", 1);
		totalCompetitorSize = intent.getIntExtra("totalCompetitorSize", 1);
	}

	private void rollbackTotalRoundInfo() {
		JSONObject jsonObject = JsonUtils
				.getJSONfromURL(LovetoConstant.SELECT_WINNER_ROUND_ROLLBACK + "?tournamentid=" + tournamentID);
		try {
			if("T".equals(jsonObject.get("result").toString())) {
				Log.d("tag", "롤백 성공");
			} else {
				Log.d("tag", "롤백 실패");
			}
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if(isNowAnimation)
			return;
		
		switch (v.getId()) {
			case R.id.footer_a:
				footerBtnEvent(0);
				break;
			case R.id.footer_b:
				footerBtnEvent(1);
				break;
			case R.id.footer_c:
				footerBtnEvent(2);
				break;
			case R.id.footer_d:
				footerBtnEvent(3);
				break;
			case R.id.footer_e:
				footerBtnEvent(4);
				break;
			case R.id.footer_f:
				footerBtnEvent(5);
				break;
			case R.id.footer_g:
				footerBtnEvent(6);
				break;
			case R.id.footer_h:
				footerBtnEvent(7);
				break;
			case R.id.btn_next_round:
				if (currentGroupNum == (groupSize-1)) { //마지막 그룹이면 다음 라운드로
					goToNextRound();
				} else {
					footerBtnEvent((currentGroupNum+1)); //마지막 그룹이 아니면
				}
				break;
			default:
				break;
		}
	}
	
	private void cardBtnEvent(Integer index) {
		List<CompetitorInfo> CompetitorInfoList = CompetitorInfoMap.get(currentGroupNum);
		for(int i=0; i<CompetitorInfoList.size(); i++) {
			if("Y".equals(CompetitorInfoList.get(i).getNextround_pass_yn()) ){
				CompetitorInfoList.get(i).setNextround_pass_yn("N");
			}
		}
		// 통과 시키고
		CompetitorInfoMap.get(currentGroupNum).get(index).setNextround_pass_yn("Y");
		isWinnerSelectedGroup = true;
	}
	
	private void footerBtnEvent(Integer index) {
		if (index < currentGroupNum) { //현재보다 아래 그룹으로 갈 때는 자유롭게
			goToGroup(index);
		} else if (index > currentGroupNum) {
			if (!isWinnerSelectedGroup) {
				viewToast("승자를 선택해주세요!"); //현재보다 다음 그룹으로 갈 때는 꼭 선택을 해야함.
			} else {
				goToGroup(index);
			}
		}
	}
	
	private void changeGroupAlphabet(Integer index) {
		switch(index){
		case 0:
			groupAlphabetImageView.setImageResource(R.drawable.text_info_tournament_group_01);
			break;
		case 1:
			groupAlphabetImageView.setImageResource(R.drawable.text_info_tournament_group_02);
			break;
		case 2:
			groupAlphabetImageView.setImageResource(R.drawable.text_info_tournament_group_03);
			break;
		case 3:
			groupAlphabetImageView.setImageResource(R.drawable.text_info_tournament_group_04);
			break;
		case 4:
			groupAlphabetImageView.setImageResource(R.drawable.text_info_tournament_group_05);
			break;
		case 5:
			groupAlphabetImageView.setImageResource(R.drawable.text_info_tournament_group_06);
			break;
		case 6:
			groupAlphabetImageView.setImageResource(R.drawable.text_info_tournament_group_07);
			break;
		case 7:
			groupAlphabetImageView.setImageResource(R.drawable.text_info_tournament_group_08);
			break;
		}
	}
	
	// 현재 있는 버튼은 초록색으로 (승자 선택 한 그룹)
	private void setSelectedBtn(int selectedBtnIndex) {
		footerBtnList.get(selectedBtnIndex).setBackgroundResource(R.drawable.layer_select_winner_btn_bottom_after_select);
	}
	
	// 현재 있는 버튼은 초록색으로 (승자 선택 한 그룹)
	private void setUnSelectedBtn(int selectedBtnIndex) {
		footerBtnList.get(selectedBtnIndex).setBackgroundResource(R.drawable.layer_select_winner_btn_bottom_before_select);
	}
	
	// 클릭한 버튼은 흰색으로 (현재 보고 있는 그룹)
	private void setSelectingBtn(int selectingBtnIndex) {
		footerBtnList.get(selectingBtnIndex).setBackgroundResource(R.drawable.layer_select_winner_btn_bottom_present);
	}
	
	//다음 라운드가기 버튼의 텍스트 설정
	private void setBtnNextRound() {
		ImageView v_btn_next_round_text = (ImageView) findViewById(R.id.btn_next_round_text);
		if (currentGroupNum == (groupSize-1)) { 
			v_btn_next_round_text.setImageResource(R.drawable.text_select_winner_bottom_complete); //마지막 그룹이면 선택 확정 텍스트
		} else {
			v_btn_next_round_text.setImageResource(R.drawable.text_select_winner_bottom_nextgroup); //아니면 다음 그룹가기 텍스트
		}
	}
	
	private void setOneGroupLayout(final List<CompetitorInfo> competitorInfoList) {
		progressDialog.setMessage("페이지를 만들고 있습니다.");
		progressDialog.show();
		
		Runnable runnable = new Runnable(){
			@Override
			public void run() {
				//UI 를 건들기 때문에 핸들러 사용.
				myHandler.post(new Runnable() {
					@Override
					public void run() {
						try {
							
							//init
							for(RelativeLayout oneMemberLayout : oneMemberLayoutList) {
								oneMemberLayout.setVisibility(View.INVISIBLE);
								oneMemberLayout.findViewById(R.id.winner_ring_small).setVisibility(ImageView.GONE);
								oneMemberLayout.findViewById(R.id.user_photo).startAnimation(animPhotoWinner);
							}
							// 셋팅
							presentCompetitorCnt = competitorInfoList.size();
							for(int i=0; i<competitorInfoList.size(); i++) {
								oneMemberLayoutList.get(i).setVisibility(View.VISIBLE);
								
								StringBuffer sb = new StringBuffer();
								// 참가자사진 셋팅
								sb.append(LovetoConstant.PHOTO_URL);
								sb.append(competitorInfoList.get(i).getRoundparticipant_memberid());
								sb.append("_1.jpg");
								ImageDownloader imageDownloader = new ImageDownloader();// 사진 다운로드
								ImageView imgView = (ImageView) oneMemberLayoutList.get(i).findViewById(R.id.user_photo);
								imageDownloader.download(sb.toString(), imgView);
								
								// 선물사진 셋팅
								imgView = (ImageView) oneMemberLayoutList.get(i).findViewById(R.id.user_gift_photo);
								imgView.setVisibility(View.VISIBLE);
								int giftid = competitorInfoList.get(i).getGiftid();
								//그림에 애니메이션을 넣을지 그림을 넣을지 판단
								if (giftid == 0) {
									// 없는거니  무시
									imgView.setVisibility(View.INVISIBLE);
								} else if (giftAnims.getGiftAnimMap().containsKey(giftid)) { 
									//로컬에 선물 아이디에 대한 애니메이션 리소스가 있으면
									imgView.setBackgroundResource(giftAnims.getGiftAnimMap().get(giftid)); //애니메이션 지정
									giftAnimList.add((AnimationDrawable)imgView.getBackground()); //애니메이션 배열에 추가 (나중에 한번에 start 하기 위해)
								} else {
									//현재 버전에 선물에 대한 애니메이션 리소스가 없으면 FTP 의 1장짜리 이미지로 대체함
									sb.setLength(0);
									sb.append(LovetoConstant.GIFT_IMAGE_URL);
									sb.append(giftid);
									sb.append(".png");
									imageDownloader.download(sb.toString(), imgView);
								}
								
								// 참가자 아이디
								TextView memberIdTextView = (TextView) oneMemberLayoutList.get(i).findViewById(R.id.user_id);
								memberIdTextView.setText(competitorInfoList.get(i).getRoundparticipant_memberid());
								
								// 참가자 아이디 그림자
								memberIdTextView = (TextView) oneMemberLayoutList.get(i).findViewById(R.id.user_id_shadow);
								memberIdTextView.setText(competitorInfoList.get(i).getRoundparticipant_memberid());
								
								// 참가자답변
								memberIdTextView = (TextView) oneMemberLayoutList.get(i).findViewById(R.id.user_comment);
								memberIdTextView.setText(competitorInfoList.get(i).getAnswer_content());
								
								//새 우승자 표시
								if ("Y".equals(competitorInfoList.get(i).getNextround_pass_yn())) {
									((ImageView)oneMemberLayoutList.get(i).findViewById(R.id.winner_ring_small)).setVisibility(ImageView.VISIBLE);
									isWinnerSelectedGroup = true;
								}
							}
							
						} catch(Exception e) {
							Log.d("tag", e.toString());
						} finally {
							progressDialog.dismiss();
						}
					}
				});
			}
		};
		new Thread(runnable).start();
	}
	
	private void goToGroup(int index) {
		if (isWinnerSelectedGroup) {
			setSelectedBtn(currentGroupNum); // 승자 선택한 이전 그룹은 초록색 버튼으로
		} else {
			setUnSelectedBtn(currentGroupNum); // 승자 선택 안한 이전 그룹은 회색 버튼으로
		}
		setSelectingBtn(index); // 흰색 버튼으로
		isWinnerSelectedGroup = false; //setOneGroupLayout 보다 위에 있어야함
		setOneGroupLayout(CompetitorInfoMap.get(index));
		changeGroupAlphabet(index); // 알파벳 셋팅
		currentGroupNum = index; // 현재 그룹번호 저장
		setBtnNextRound(); //바뀐 currentGroupNum을 기준으로 다음가기 버튼 설정
	}
	
	private void goToNextRound() {
		if (!isWinnerSelectedGroup) { //마지막 그룹에서 승자를 선택 안 한 경우
			viewToast("먼저 현재 조에서 승자를 선택해주세요.");
			return;
		}
		List<CompetitorInfo> winnerInfoList = new ArrayList<CompetitorInfo>();
		// 선택하지 않은 그룹이 있는지 체크하기
		 for(int i=0; i<groupSize; i++) {
			boolean isComplete = false;
			Integer competitorInfoListSize = CompetitorInfoMap.get(i).size();
			for(int j=0; j<competitorInfoListSize; j++) {
				if("Y".equals(CompetitorInfoMap.get(i).get(j).getNextround_pass_yn())){
					isComplete = true;
					winnerInfoList.add(CompetitorInfoMap.get(i).get(j));
					break;
				}
			}
			
			if(!isComplete) {
				viewToast("선택하지 않은 그룹이 있습니다.");
				return;
			}
		}
		// 데이터 전송
		StringBuffer sb = new StringBuffer();
		sb.append(LovetoConstant.SELECT_WINNER_ROUND_INSERT_WINNER);
		sb.append("?tournamentid=");
		sb.append(tournamentID);
		sb.append("&roundseq=");
		sb.append(roundSeq);
		
		ArrayList<String> winnerIDList = new ArrayList<String>(); // 진출자 IDs
		for(CompetitorInfo competitorInfo : winnerInfoList) {
			sb.append("&winnerList[]=");
			sb.append(competitorInfo.getRoundparticipant_memberid());
			winnerIDList.add(competitorInfo.getRoundparticipant_memberid());
		}
		Log.d("tag", "INSERT_WINNER:" + sb.toString());
		
		JSONObject jsonObject = JsonUtils.getJSONfromURL(sb.toString());
		try {
			if("F".equals(jsonObject.get("result").toString())) {
				viewToast("결과 전송이 되지 않았습니다.");
			} else {
				// 데이터 전송 성공 -> 화면 전환
				Intent intent = null;
				if(winnerInfoList.size() == 1) { // 최종 우승자 결정
					intent = new Intent(SelectWinner1RoundActivity.this, SelectWinnerCompleteActivity.class);
					intent.putExtra("memberid", winnerInfoList.get(0).getRoundparticipant_memberid());
					intent.putExtra("gender", winnerInfoList.get(0).getGender());
					intent.putExtra("age", winnerInfoList.get(0).getAge());
					intent.putExtra("job", winnerInfoList.get(0).getJob());
					intent.putExtra("height", winnerInfoList.get(0).getHeight());
				} else { // 계속 토너먼트
					intent = new Intent(SelectWinner1RoundActivity.this, SelectWinnerIntermidRoundActivity.class);
					intent.putExtra("roundSeq", 2);
					intent.putStringArrayListExtra("winnerIDList", winnerIDList);
					intent.putExtra("totalCompetitorSize", totalCompetitorSize);
				}
				intent.putIntegerArrayListExtra("giftidList", giftidList);
				intent.putExtra("tournamentID", tournamentID);
				startActivity(intent);
			}
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private void getCompetitorJSONAndSetFooter() {
		try {
			// 라운드정보들 다 가져오기
			String jsonText = JsonUtils
					.getStringFromUrl(LovetoConstant.SELECT_WINNER_ROUND + "?tournamentid=" + tournamentID+"&roundseq=" + roundSeq);
			//Log.d("tag", jsonText);

			JSONArray jsonArrayByGroup = new JSONArray(jsonText);
			groupSize = jsonArrayByGroup.length();
			for(int i=0; i<groupSize; i++) {
				JSONObject objectByGroup = jsonArrayByGroup.getJSONObject(i);
				Integer groupNum = objectByGroup.getInt("group");
				JSONArray jsonArray = objectByGroup.getJSONArray("list");
				
				List<CompetitorInfo> competitorInfoList = new ArrayList<CompetitorInfo>();
				Integer jsonArrayLen = jsonArray.length();
				//Log.d("tag", "길이는 : "+ jsonArray.length());
				for(int j=0; j<jsonArrayLen; j++) {
					JSONObject object = jsonArray.getJSONObject(j);
					CompetitorInfo competitorInfo = new CompetitorInfo(
						object.getString("roundparticipant_memberid"),
						object.getString("answer_endtime"),
						object.getString("regdate"),
						object.getString("photo_url1"),
						object.getString("local"),
						object.getString("age"), 
						object.getString("gender"),
						object.getString("answer_content"),
						object.getString("nextround_pass_yn"),
						object.getString("height"),
						object.getString("job"), 
						object.getInt("giftid"), 
						object.getString("tournament_maker_memberid")
					);
					if(object.getInt("giftid") != 0)
						giftidList.add(object.getInt("giftid"));
					
					competitorInfoList.add(competitorInfo);
					//Log.d("tag", competitorInfo.getRoundparticipant_memberid());
				}
				// data 저장
				CompetitorInfoMap.put(groupNum-1, competitorInfoList);
				
				// footer 셋팅
				//Log.d("tag", "footer 셋팅");
				if(i == 0) {
					((ImageView) footerBtnList.get(i).getChildAt(0)).setImageResource(R.drawable.text_select_winner_bottom_group_a);
				} else if(i == 1) {
					((ImageView) footerBtnList.get(i).getChildAt(0)).setImageResource(R.drawable.text_select_winner_bottom_group_b);
				} else if(i == 2) {
					((ImageView) footerBtnList.get(i).getChildAt(0)).setImageResource(R.drawable.text_select_winner_bottom_group_c);
				} else if(i == 3) {
					((ImageView) footerBtnList.get(i).getChildAt(0)).setImageResource(R.drawable.text_select_winner_bottom_group_d);
				} else if(i == 4) {
					((ImageView) footerBtnList.get(i).getChildAt(0)).setImageResource(R.drawable.text_select_winner_bottom_group_e);
				} else if(i == 5) {
					((ImageView) footerBtnList.get(i).getChildAt(0)).setImageResource(R.drawable.text_select_winner_bottom_group_f);
				} else if(i == 6) {
					((ImageView) footerBtnList.get(i).getChildAt(0)).setImageResource(R.drawable.text_select_winner_bottom_group_g);
				} else if(i == 7) {
					((ImageView) footerBtnList.get(i).getChildAt(0)).setImageResource(R.drawable.text_select_winner_bottom_group_h);
				}
				footerBtnList.get(i).setBackgroundResource(R.drawable.layer_select_winner_btn_bottom_before_select);
				footerBtnList.get(i).setOnClickListener(SelectWinner1RoundActivity.this);
			}
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//화면에 그림을 그릴 수 있도록 해주는 커스텀뷰
	public class MyView extends View {

		private Bitmap mBitmap;
		private Path mPath;
		private Paint mBitmapPaint;

		public MyView(Context c) {
			super(c);

			/*
			 * 비어있는 비트맵을 생성합니다. 이 비트맵에 그리기를 수행하게 됩니다.
			 */
			mBitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888);
			mPath = new Path();
			mBitmapPaint = new Paint(Paint.DITHER_FLAG);
		}

		
		@Override
		protected void onDraw(Canvas canvas) {
			canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

			canvas.drawPath(mPath, mPaint);
		}

		private float mX, mY;
		private static final float TOUCH_TOLERANCE = 4;

		/*
		 * 액티비티 화면에 터치를 하면 선을 초기화 합니다. 현재 경로값을 업데이트 합니다. 실제 터치 이벤트는 밑에
		 * onTouchEvent 메소드에서 발생하고, 그 메소드에서 이 메소드를 호출합니다.
		 */
		private void touch_start(float x, float y) {
			mPath.reset();
			mPath.moveTo(x, y);
			mX = x;
			mY = y;
			posCircleTop = (int) y;
			posCircleLeft = (int) x;
			posCircleRight = (int) x;
			posCircleBottom = (int) y;
		}

		/*
		 * 터치 후 드래그를 하면 계속해서 이 메소드가 실시간으로 호출되고, 현재 패스값을 바꾸면서 저장을 합니다. 현재 경로값을
		 * 실시간으로 업데이트 합니다. 실제 터치 이벤트는 밑에 onTouchEvent 메소드에서 발생하고, 그 메소드에서 이 메소드를
		 * 호출합니다.
		 */
		private void touch_move(float x, float y) {
			float dx = Math.abs(x - mX);
			float dy = Math.abs(y - mY);
			if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
				mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
				mX = x;
				mY = y;
				if (posCircleTop > y) { //동그라미의 끝점을 구하기
					posCircleTop = (int) y;
					posCircleTopX = (int) x;
				}
				if (posCircleBottom < y) { //동그라미의 끝점을 구하기
					posCircleBottom = (int) y;
					posCircleBottomX = (int) x;
				}
				if (posCircleRight < x) { //동그라미의 끝점을 구하기
					posCircleRight = (int) x;
					posCircleRightY = (int) y;
				}
				if (posCircleLeft > x) { //동그라미의 끝점을 구하기
					posCircleLeft = (int) x;
					posCircleLeftY = (int) y;
				}
			}
		}

		/*
		 * 드래그하다가 손을 화면에서 떼는 순간 호출되어, 선을 그리기를 마무리 합니다. 실제 터치 이벤트는 밑에
		 * onTouchEvent 메소드에서 발생하고, 그 메소드에서 이 메소드를 호출합니다.
		 */
		private void touch_up() {
			mPath.lineTo(mX, mY);
			// commit the path to our offscreen
			//mCanvas.drawPath(mPath, mPaint);
			// kill this so we don't double draw
			Log.d("tag","posCircleTop"+posCircleTop+"posCircleBottom"+posCircleBottom);
			Log.d("tag","posCircleLeft"+posCircleLeft+"posCircleRight"+posCircleRight);
			mPath.reset();
			//동그라미 끝점으로 선택한 승자 체크하기
			checkWinner(posCircleTop,posCircleTopX,posCircleBottom,posCircleBottomX,posCircleLeft,posCircleLeftY,posCircleRight,posCircleRightY);
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see android.view.View#onTouchEvent(android.view.MotionEvent) 위의 세가지
		 * 터치 이벤트에서 설정한 경로값을 실시간으로, 이 이벤트에서 각 터치 이벤트 종류에 따라서 경로값을 재설정하고,
		 * invalidate 메소드를 호출하여, 액티비티 화면에 다시 그리기를 수행합니다.
		 */
		@Override
		public boolean onTouchEvent(MotionEvent event) {
			float x = event.getX();
			float y = event.getY();

			switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				touch_start(x, y);
				invalidate();
				break;
			case MotionEvent.ACTION_MOVE:
				touch_move(x, y);
				invalidate();
				break;
			case MotionEvent.ACTION_UP:
				touch_up();
				invalidate();
				break;
			}
			return true;
		}
		
	}
	
	//애니메이션은 윈도우에 포커스가 간 뒤에 스타트 시켜야 제대로 나옴.
	@Override
	public void onWindowFocusChanged(boolean hasFocus) {
		for (int i=0;i<giftAnimList.size();i++) {
			giftAnimList.get(i).start();
		}
	    super.onWindowFocusChanged(hasFocus);
	}
	
	//승자에대한 연출을 보여줌.
	private void viewCelebrate() {
		//기존의 승리 표시는 삭제 (작은 동그라미)
		for(RelativeLayout oneMemberLayout :oneMemberLayoutList) {
			oneMemberLayout.findViewById(R.id.winner_ring_small).setVisibility(ImageView.GONE);
		}
		
		//화면 전체 갱신을 위한 에니매이션
		v_content_main_outer.startAnimation(animWhole);
		
		//승자의 애니메이션 연출
		((ImageView)oneMemberLayoutList.get((presentWinner-1)).findViewById(R.id.winner_ring)).setVisibility(ImageView.VISIBLE);
		((ImageView)oneMemberLayoutList.get((presentWinner-1)).findViewById(R.id.winner_ring)).startAnimation(animRing);
		((ImageView)oneMemberLayoutList.get((presentWinner-1)).findViewById(R.id.winner_text_celebrate)).setVisibility(ImageView.VISIBLE);
		((ImageView)oneMemberLayoutList.get((presentWinner-1)).findViewById(R.id.winner_text_celebrate)).startAnimation(animText);
		((ImageView)oneMemberLayoutList.get((presentWinner-1)).findViewById(R.id.user_photo)).startAnimation(animPhotoWinner);
		
		//패자의 애니메이션 연출
		for(int i=0;i<oneMemberLayoutList.size();i++) {
			if (i != (presentWinner-1)) {
				((ImageView)oneMemberLayoutList.get(i).findViewById(R.id.user_photo)).startAnimation(animPhotoLoser);
			}
		}
	}
	
	//그린 그림으로 우승자체크를 확인
	private void checkWinner (int top,int top_x,int bottom,int bottom_x,int left,int left_y,int right,int right_y) {
		//원의 중심 구하기
		int centerX = (int)(left+right)/2;
		int centerY = (int)(top+bottom)/2;
		Log.d("tag","centerX:" + centerX);
		Log.d("tag","centerY:" + centerY);
		
		//화면 크기 구하기
		Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
		int displayWidth = display.getWidth();
		int displayHeight = display.getHeight()-(45+40);//헤더와 푸터의 높이를 뺀.
		Log.d("tag","displayWidth:" + displayWidth);
		Log.d("tag","displayHeight:" + displayHeight);
		int heightGroup = 33; //그룹 표시 영역 높이
		
		//원이 너무 작으면 실패
		if ((bottom-top) < (displayHeight/10)) { //세로 크기가 세로 전체 영역의 1/20 이상이어야 함. 
			Log.d("tag","원이 너무 작아!");
			Log.d("tag","bottom-top:"+(bottom-top)+"displayHeight/20:"+(displayHeight/20));
			return;
		} else if ((right-left) < (displayWidth/10)) { //가로 크기가 세로 전체 영역의 1/20 이상이어야 함.
			Log.d("tag","원이 너무 작아!");
			return;
		}
		
		//원이 너무 커도 실패
		if ((bottom-top) > (displayHeight/2)||(right-left) > (displayWidth/2)) { //세로 크기가 세로 전체 영역의 1/2 보다 작아야함. 
			Log.d("tag","원이 너무 커!");
			return;
		}
		
		//너무 홀쭉하거나 납작해도 안됨
		if ((bottom-top)/(right-left) > 3||(float)(bottom-top)/(right-left) < 0.3) {
			Log.d("tag","원이 너무 길거나 납작해!");
			Log.d("tag","(bottom-top)/(right-left):"+(float)(bottom-top)/(right-left));
			return;
		}
		
		int err = 0;
		//모양이 대략 원과 비슷해야함
		if ((right_y - top) < ((bottom - top)/5)||(left_y - top) < ((bottom - top)/5)) {
			Log.d("tag","윗점이 오른쪽 점, 왼쪽점과 너무 가까워!");
			err++;
		}
		if ((bottom - right_y) < ((bottom - top)/5)||(bottom - left_y) < ((bottom - top)/5)) {
			Log.d("tag","아랫이 오른쪽 점, 왼쪽점과 너무 가까워!");
			err++;
		}
		if ((top_x - left) < ((right - left)/5)||(bottom_x - left) < ((right - left)/5)) {
			Log.d("tag","왼쪽점이 윗점 아랫점과 너무 가까워!");
			err++;
		}
		if ((right - bottom_x) < ((right - left)/5)||(right - top_x) < ((right - left)/5)) {
			Log.d("tag","오른쪽점이 윗점 아랫점과 너무 가까워!");
			err++;
		}
		if (err > 2) {
			Log.d("tag","모양이 너무 구려!");
			return;
		}
		
		//원의 중심점의 위치로 선택한 사람의 위치를 파악함.
		if (displayHeight<heightGroup) { 
			Log.d("tag","조표시에 동그라미!"); //너무 윘쪽에 했을 때
			return;
		} else {
			if ( displayWidth/2 > centerX) { //좌측에 있는 사람일 때
				if (((displayHeight-heightGroup)/2)+heightGroup > centerY) { //윘쪽에 있는 사람일 때
					if (!isNowAnimation) {
						Log.d("tag","1번 우승!");
						presentWinner = 1;
						viewCelebrate();
						cardBtnEvent(0);
						isNowAnimation = true;
					}
				} else {
					Log.d("tag","3번 우승!");
					if (!isNowAnimation && presentCompetitorCnt >= 3) {
						presentWinner = 3;
						viewCelebrate();
						cardBtnEvent(2);
						isNowAnimation = true;
					}
				}
			} else {
				if (((displayHeight-heightGroup)/2)+heightGroup > centerY) { //윘쪽에 있는 사람일 때
					Log.d("tag","2번 우승!");
					if (!isNowAnimation && presentCompetitorCnt >= 2) {
						presentWinner = 2;
						viewCelebrate();
						cardBtnEvent(1);
						isNowAnimation = true;
					}
				} else {
					Log.d("tag","4번 우승!");
					if (!isNowAnimation && presentCompetitorCnt >= 4) {
						presentWinner = 4;
						viewCelebrate();
						cardBtnEvent(3);
						isNowAnimation = true;
					}
				}
			}
		}
		
	}
}
